home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SPACE 1
/
SPACE - Library 1 - Volume 1.iso
/
program
/
441
/
dlibs12
/
hsort.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-11-23
|
3KB
|
167 lines
/*
* Heap sorting functions
*/
static _wsift(base, i, n, cmp)
register int *base;
register int i;
register int n;
register int (*cmp)();
{
register int j, t;
while((j = ((i << 1) + 1)) < n)
{
if((j < (n - 1)) && ((*cmp)((base+j), (base+j+1)) < 0))
++j;
if((*cmp)((base+i), (base+j)) < 0)
{
t = base[i];
base[i] = base[j];
base[j] = t;
i = j;
}
else
break;
}
}
static _whsort(base, num, cmp)
register int *base;
register int num;
register int (*cmp)();
{
register int i, j;
for(i = ((num >> 1) - 1); (i > 0); --i)
_wsift(base, i, num, cmp);
i = num;
while(i > 1)
{
_wsift(base, 0, i--, cmp);
j = *base;
*base = *(base + i);
*(base + i) = j;
}
}
static _lsift(base, i, n, cmp)
register long *base;
register int i;
register int n;
register int (*cmp)();
{
register int j;
register long t;
while((j = ((i << 1) + 1)) < n)
{
if((j < (n - 1)) && ((*cmp)((base+j), (base+j+1)) < 0))
++j;
if((*cmp)((base+i), (base+j)) < 0)
{
t = base[i];
base[i] = base[j];
base[j] = t;
i = j;
}
else
break;
}
}
static _lhsort(base, num, cmp)
register long *base;
register int num;
register int (*cmp)();
{
register int i;
register long j;
for(i = ((num >> 1) - 1); (i > 0); --i)
_lsift(base, i, num, cmp);
i = num;
while(i > 1)
{
_lsift(base, 0, i--, cmp);
j = *base;
*base = *(base + i);
*(base + i) = j;
}
}
static _nswap(pa, pb, n)
register char *pa;
register char *pb;
register int n;
{
register char c;
while(n--)
{
c = *pa;
*pa++ = *pb;
*pb++ = c;
}
}
static _nsift(base, i, n, size, cmp)
register char *base;
register int i;
register int n;
register int size;
register int (*cmp)();
{
register int j;
register char *p;
while((j = ((i << 1) + 1)) < n)
{
p = (base+size*j);
if((j < (n - 1)) && ((*cmp)(p, p+size) < 0))
{
++j;
p += size;
}
if((*cmp)((base+size*i), p) < 0)
{
_nswap((base+size*i), p, size);
i = j;
}
else
break;
}
}
static _nhsort(base, num, size, cmp)
register char *base;
register int num;
register int size;
register int (*cmp)();
{
register int i, j;
for(i = ((num >> 1) - 1); (i > 0); --i)
_nsift(base, i, num, size, cmp);
i = num;
while(i > 1)
{
_nsift(base, 0, i--, size, cmp);
_nswap(base, (base+size*i), size);
}
}
hsort(base, num, size, cmp)
char *base;
int num;
int size;
int (*cmp)();
{
if(size == 2)
_whsort(base, num, cmp);
else if(size == 4)
_lhsort(base, num, cmp);
else
_nhsort(base, num, size, cmp);
}